<?php
class ModelShippingSedex extends Model {
	function getQuote($address) {
		$this->load->language('shipping/sedex');
		
		if ($this->config->get('sedex_status')) {		
      		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "zone_to_geo_zone WHERE geo_zone_id = '" . (int)$this->config->get('sedex_geo_zone_id') . "' AND country_id = '" . (int)$address['country_id'] . "' AND (zone_id = '" . (int)$address['zone_id'] . "' OR zone_id = '0')");
		
      		if (!$this->config->get('sedex_geo_zone_id')) {
        		$status = TRUE;
      		} elseif ($query->num_rows) {
        		$status = TRUE;
      		} else {
        		$status = FALSE;
      		}
		} else {
			$status = FALSE;
		}

		$method_data = array();
	
		if ($status) {
	
 function arredonda_peso_sedex($peso){
       $tipo = gettype($peso);
       $peso = str_replace(",",".",$peso);
       settype($peso,"float");
       if (floor($peso)<$peso) {
         $peso = ceil($peso);
	   }

       settype($peso,$tipo);
       return $peso;
    }	
	
function calcula_sedex_pag($cepOrigem,$cepDestino,$peso,$valoor){

require_once('frete.php');

$frete = new PgsFrete;

$valorFrete = $frete->gerar($cepOrigem, $peso, $valoor, $cepDestino);
if($valorFrete=='erro1'){
$erro_postall='-3';
return $dadosfrete = array("valor" => "0.0", "errofrete" => $erro_postall);
}
else {

return $dadosfrete = array("valor" =>  number_format($valorFrete['Sedex'], 2, '.', ''), "errofrete" => 0);
}

}	

function calcula_sedex($cepOrigem,$cepDestino,$peso,$valoor){	  
	  
     $urlCorreios = "http://www.correios.com.br/encomendas/precos/calculo.cfm?resposta=xml&servico=40010&cepOrigem=%s&cepDestino=%s&peso=%s&valorDeclarado=%s";
      $urlCorreios = sprintf($urlCorreios, $cepOrigem, $cepDestino, $peso, $valoor);
      //carregando url dos correios...

      // inicio modificacao bruno trazzini
      $ch = curl_init();
      curl_setopt ($ch, CURLOPT_URL, $urlCorreios);
      curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 0);

      $file_contents = curl_exec($ch);
      curl_close($ch);
	  

      $carrega = explode("\n", $file_contents);
      $conteudo = trim(str_replace(array("\n", chr(13)), "", implode($carrega, "")));
      // fim modificacao bruno trazzini
      if(strlen($conteudo) <1) return false;
      //informações de origem tratadas com RegExp...
	  
      
      if(preg_match_all("/<preco_postal>(.*)<\/preco_postal>/", $conteudo, $preco_postal)){
		
		$preco_da_postagem = $preco_postal[1][0];  
		preg_match_all("/<tarifa_valor_declarado>(.*)<\/tarifa_valor_declarado>/", $conteudo, $preco_tarifa);
		$preco_da_tarifa = $preco_tarifa[1][0];
		$preco_da_postagel = ($preco_da_postagem + $preco_da_tarifa); 
		  
	  }else {
		  
		$preco_da_postagel=0;  
		  
	  }
      
      if($preco_da_postagel){
		  $valooor= floatval($preco_da_postagel);
	  return $dadosfrete = array("valor" =>  number_format($valooor, 2, '.', ''), "errofrete" => 0);


	  }else {
		  
		if(!preg_match_all("/<codigo>(.*)<\/codigo>/", $conteudo, $erro_postal)){
		$erro_postall= 666;
		}else {
			
		$erro_postall=$erro_postal[1][0];
		
		}
		 
		return $dadosfrete = array("valor" => "0.0", "errofrete" => $erro_postall);

	 
	 }

}
	
			
    // Função getSEDEX retirada do blog Lucas Ferreira
    //http://blog.lucasferreira.com/2008/02/11/correios-sedex-e-o-tao-famigerado-calculo-de-frete/
      $cepOrigem = $this->config->get('sedex_postcode');
      $cepDestino = $address['postcode'];
      $peso = $this->cart->getWeight();
	  
	   $total_compra = $this->tax->calculate($this->cart->getSubTotal(), $this->config->get('zone_tax_class_id'), $this->config->get('config_tax'));
	  
	  
	  $total_compra =  preg_replace("/[^0-9]/", "", $total_compra);


		$total_compra = number_format($total_compra,'2','.','');
	  
      if($peso==0){
		
		$peso = 0.300;
	  
	  }
	$peso = arredonda_peso_sedex($peso); 
	
	
if($peso>30) {
         $var_quant = ceil($peso / 30);
         $pesoparcial = ceil($peso / $var_quant);
         $valorparcial = ceil($total_compra / $var_quant);
         $resultado = 0;
         for($i=1;$i<=$var_quant;$i++) {
		 if($this->config->get('pac_modofrete')==1){
		 $valorparcial = number_format($valorparcial,'2',',','');
		  $shipping = calcula_sedex_pag($cepOrigem,$cepDestino,$pesoparcial,$valorparcial); //pagseguro
		 }else{
            $shipping = calcula_sedex($cepOrigem,$cepDestino,$pesoparcial,$valorparcial); //correios
			}
            $resultado = $resultado + $shipping['valor'];
			
         }
      }
      else {
	  if($this->config->get('pac_modofrete')==1){
	  $total_compra = number_format($total_compra,'2',',','');
	   $shipping = calcula_sedex_pag($cepOrigem,$cepDestino,$peso,$total_compra);
	  }else{
          $shipping = calcula_sedex($cepOrigem,$cepDestino,$peso,$total_compra);
		  }
           $resultado = $shipping['valor'];
      }	
	
	
	  
   
			
if($shipping['errofrete']){
	
$titulo_sedex = $this->language->get('text_sedex_title_erro_correios');
$descricao_sedex = $this->language->get('text_sedex_erro_busca_valor');

	if($shipping['errofrete']==31){
	$descricao_sedex.=$this->language->get('text_sedex_erro_cod_31');

    }else if($shipping['errofrete']=="-4") {
	$descricao_sedex.=$this->language->get('text_sedex_erro_cod_-4');
	
	}else  if($shipping['errofrete']=="-2") {
	$descricao_sedex.=$this->language->get('text_sedex_erro_cod_-2');
	
	}else  if($shipping['errofrete']=="-3") {
	$descricao_sedex.=$this->language->get('text_sedex_erro_cod_-3');
	
	}
	
	else  if($shipping['errofrete']=="666") {
	$descricao_sedex.=$this->language->get('text_sedex_erro_cod_666');
	
	}
	
}else {
$titulo_sedex = $this->language->get('text_sedex_title');
$descricao_sedex = $this->language->get('text_sedex_description');		
	
}



			
			$quote_data = array();
			
      		$quote_data['sedex'] = array(
        		'id'           => 'sedex.sedex',
        		'title'        => $descricao_sedex,
        		'cost'         => $resultado,
        		'tax_class_id' => $this->config->get('sedex_tax_class_id'),
				'text'         => $this->currency->format($this->tax->calculate($resultado, $this->config->get('sedex_tax_class_id'), $this->config->get('config_tax')))
      		);

      		$method_data = array(
        		'id'         => 'sedex',
        		'title'      => $titulo_sedex,
        		'quote'      => $quote_data,
				'sort_order' => $this->config->get('sedex_sort_order'),
        		'error'      => FALSE
      		);
		}
	
		return $method_data;
	}
}
?>